package com.sxj.corejava.code08_常用类.泛型;

/**
 * @author 石小俊
 */
public class Emp<T, V, K, E> {

    public void show(T t, V v, K k, E e) {
        System.out.println(t);
        System.out.println(v);
        System.out.println(k);
        System.out.println(e);
    }

    // ? extends B表示指定了泛型的上限。泛型的参数类型必须是B的子孙类
    public Student<? extends B> test01() {
        // return new Student<A>();    // 父类,报错
        // return new Student<B>();   // B本身,可以
        return new Student<C>();   // C是B的子类,可以
        // return new Student<D>(); // D与B都属于A的子类,与B无关,报错
    }

    // ? super C表示指定了泛型的下线。泛型的参数类型必须是C一级C的祖宗类
    public Student<? super C> test02() {
        // return new Student<A>();    // A是C的父类的父类,可以
        // return new Student<B>();       // B是C的父类,可以
        return new Student<C>();       // C是本身,可以
        // return new Student<D>();       // D与C无关,报错
    }

}

class A {

}

class B extends A {

}

class C extends B {

}

class D extends A {

}

class Test04 {
    public static void main(String[] args) {
        Emp<String, Integer, Double, Boolean> emp = new Emp<>();
        emp.show("admin", 1, 3.14, true);
    }
}